package acm.pta15;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main龙龙送外卖 {
	// bj数组用于存储每个节点的深度，max用于存储最大深度
	static int bj[],max=0;
	// aa数组用于存储每个节点的双亲节点的编号，beg用于存储外卖站的位置
	static int aa[],beg=0;

	public static void main(String[] args) throws IOException {
		// 创建StreamTokenizer对象用于读取和解析输入的数据
		StreamTokenizer x=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out=new PrintWriter(System.out);
		x.nextToken();
		int n=(int)x.nval;  // 读取树上节点的个数
		x.nextToken();
		int m=(int)x.nval;  // 读取新增的送餐地址的个数
		aa=new int[n+1];
		bj=new int[n+1];
		for(int i=1;i<=n;i++) {
			x.nextToken();
			aa[i]=(int)x.nval;  // 读取每个节点的双亲节点的编号
			if(aa[i]==-1)
				beg=i;  // 如果双亲节点的编号为-1，那么这个节点就是外卖站
		}
		int sum=0;  // 初始化总距离为0
		while(m--!=0) {
			x.nextToken();
			int i=(int)x.nval;  // 读取新增的送餐地址的编号
			sum+=dfs(i,0);  // 调用dfs方法计算从新增的送餐地址到遇到的节点的距离，并累加到总距离中
			out.println(sum-max);  // 打印出送完所有外卖所需的最短路程
		}
		out.flush();
	}

	// dfs方法是一个递归方法，用于计算从新增的送餐地址到遇到的节点的距离
	public static int dfs(int i,int l) {
		if(i==beg||bj[i]!=0) {  // 如果当前节点是外卖站或者已经遍历过，那么返回当前深度的两倍
			max=Math.max(max, bj[i]+l);  // 更新最大深度
			return l*2;
		}
		int p=dfs(aa[i],l+1);  // 否则，递归调用dfs方法，深度加1
		bj[i]=bj[aa[i]]+1;  // 更新当前节点的深度
		return p;  // 返回从新增的送餐地址到遇到的节点的距离
	}
}
